/*
 *      Author: Honrun
 */
#ifndef _DevicesKey_H_
#define _DevicesKey_H_

#include "driver/gpio.h"
#include "hal/gpio_hal.h"


#define KEY_RESET_Pin                   GPIO_NUM_9


#define KEY_RESET                       0x01
#define KEY_ALL                         (KEY_RESET)


/* 短按键时间ms */
#define KEY_SHORT_TIME                  50
/* 长按键时间ms */
#define KEY_LONG_TIME                   1000
/* 持续按键启动时间ms */
#define KEY_CONTINUE_TIME               2000
/* 持续按键间隔时间ms */
#define KEY_CONTINUE_INTERVAL_TIME      100
/* 持续按键启动时间ms */
#define KEY_UP_TIME                     200


typedef enum {
    keyNormal       = 0,

    keyShort        = 0x01,             /* 短按 */
    keyLong         = 0x02,             /* 长按 */
    keyContinuous   = 0x04,             /* 持续按 */
    keyCombo        = 0x08,             /* 连击 */

    keyDown         = 0x10,             /* 按下 */
    keyUp           = 0x20,             /* 松开 */
    keyDownAndUp    = 0x40,             /* 即松开旧按键、并且按下了新按键 */
    keyEqual        = 0x80,             /* 当前按键值与上次按键值相同 */
}KeyStateEnum;


typedef struct
{
    uint32_t (*uiKeyValueGet)(void);    /* 按键键值读取函数 */

    uint32_t valueLast;                 /* 当前状态的按下键值 */
    uint32_t valueDown;                 /* 新增的按下键值 */
    uint32_t valueUp;                   /* 新增的松开键值 */

    int32_t timeDown;                   /* 最后一次按下的时刻 */
    int32_t timeUp;                     /* 最后一次松开的时刻 */

    KeyStateEnum state;                 /* 状态 */
    KeyStateEnum stateLast;             /* 状态 */
    uint8_t cntCombo;                   /* 连击次数 */
}KeyType;


extern KeyType g_typeKey;


void vKeyInit(void);
uint32_t uiKeyValueGet(void);
KeyStateEnum enumKeyMachine(KeyType *ptypeKey);


#endif
